package csu.web.credit_bank.utils;



import com.alibaba.druid.util.StringUtils;
import io.jsonwebtoken.*;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@ConfigurationProperties(prefix = "jwt.token")
public class JwtHelper {

    private  long tokenExpiration; //有效时间,单位毫秒 1000毫秒 == 1秒
    private  String tokenSignKey;  //当前程序签名秘钥

    //生成token字符串
    public  String createToken(String userId) {
        System.out.println("tokenExpiration = " + tokenExpiration);
        System.out.println("tokenSignKey = " + tokenSignKey);
        String token = Jwts.builder()
                .setSubject("YYGH-USER")
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration*1000*60)) //单位分钟
                .claim("userId", userId)
                .signWith(SignatureAlgorithm.HS512, tokenSignKey)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }
    //从token字符串获取userid
    // 将返回类型从 Long 改为 String，并修正内部类型转换，以匹配createToken时放入的String类型】
    public String getUserId(String token) {
        if (StringUtils.isEmpty(token)) return null;
        try {

            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();
            // JWT claim 中存储的 "userId" 是 String 类型 (由 createToken 方法决定)，
            // 因此在这里直接将其强制转换为 String 是正确的。
            String userId = (String) claims.get("userId");
            return userId;
        } catch (ExpiredJwtException e) {
            // Token 已过期
            System.err.println("JWT Token Expired: " + e.getMessage());
            return null;
        } catch (UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) {
            // 无效的 Token（签名不匹配，格式错误等）
            System.err.println("Invalid JWT Token: " + e.getMessage());
            return null;
        } catch (Exception e) {
            // 其他未知异常
            System.err.println("Error getting userId from JWT: " + e.getMessage());
            e.printStackTrace(); // 打印完整堆栈信息以便调试
            return null;
        }
    }
    //判断token是否有效
    public  boolean isExpiration(String token){
        try {
            boolean isExpire = Jwts.parser()
                    .setSigningKey(tokenSignKey)
                    .parseClaimsJws(token)
                    .getBody()
                    .getExpiration().before(new Date());
            //没有过期，有效，返回false
            return isExpire;
        }catch(Exception e) {
            //过期出现异常，返回true
            return true;
        }
    }

    public long getTokenExpiration() {
        return tokenExpiration;
    }

    public void setTokenExpiration(long tokenExpiration) {
        this.tokenExpiration = tokenExpiration;
    }

    public String getTokenSignKey() {
        return tokenSignKey;
    }

    public void setTokenSignKey(String tokenSignKey) {
        this.tokenSignKey = tokenSignKey;
    }

    /**
    * @param authorizationHeader 请求头
    * @return token
    * */
    public String getTokenFromHeader(String authorizationHeader) {
        if (StringUtils.isEmpty(authorizationHeader)) {
            return null;
        }
        // Token 通常以 "Bearer " 开头
        if (authorizationHeader.startsWith("Bearer ")) {
            // 提取 "Bearer " 后面的部分
            return authorizationHeader.substring(7);
        }
        // 如果格式不正确，则返回 null 或整个 header，这里返回 null 更安全
        return null;
    }
}
